function byte2str(param) {
  let str
  const s = param.toString(16)
  if (param < 16) {
    str = "0" + s
  } else {
    str = s
  }
  return str
}

// 读命令
function command03(stationNumber, position, length) {
  let commandArray = []
  commandArray.push(stationNumber)
  // 读
  commandArray.push(0x03)
  // 起始地址
  commandArray.push(position >> 8 & 0xff)
  commandArray.push(position & 0xff)

  // 低位 0000
  commandArray.push(0)
  // 读几个寄存器
  // length:1
  // 0001
  commandArray.push(length)

  return buildCode(commandArray)
}

/**
 *
 * @param stationNumber 站号
 * @param position 寄存器位置
 * @param length 要写几个寄存器
 * @param value 要写入的具体数值
 */
function command10(stationNumber, position, length, value) {
  let commandArray = []
  // 站号
  commandArray.push(stationNumber)
  // 写命令
  commandArray.push(0x10)
  // 起始地址
  commandArray.push(position >> 8 & 0xff)
  commandArray.push(position & 0xff)

  commandArray.push(0)
  // 写几个寄存器
  commandArray.push(length)
  // 一个寄存器2个字节
  commandArray.push(length * 2)

  commandArray.push(value >> 8 & 0xff)
  commandArray.push(value & 0xff)

  return buildCode(commandArray)
}

function buildCode(array) {
  let sendCommand = ''
  for (let i = 0; i < array.length; ++i) {
    sendCommand = sendCommand + byte2str(array[i]) + ' '
  }
  return sendCommand
}

/**
 * 普通字符串转16进制字符串
 * @param str 普通字符串
 * @returns {string} 16进制字符串
 */
function str2hex(str) {
  let val = ''
  for (let i = 0; i < str.length; ++i) {
    if (val === '') {
      val = byte2str(str.charCodeAt(i))
    } else {
      val += ' ' + byte2str(str.charCodeAt(i))
    }
  }
  return val
}

/**
 * 构造发送对象
 * @param message 指令
 * @param commandType 指令类型 (0设置主站信息 1读取主站信息 2设置副站信息 3读取副站信息)
 * @param data 具体数据
 * @param gatewayNumber 网关编号
 * @param param 其他参数
 */
function buildSendObject(message, commandType, data, gatewayNumber, param) {
  let sendObj = {}
  sendObj['message'] = message
  sendObj['commandType'] = commandType
  sendObj['data'] = data
  sendObj['gatewayNumber'] = gatewayNumber
  sendObj['param'] = param
  return sendObj
}

module.exports = {
  command03,
  command10,
  buildCode,
  str2hex,
  buildSendObject
}


